/**
 * 深度合并对象
 * @param {Object} target - 目标对象
 * @param {Object} source - 源对象
 * @returns {Object} 合并后的对象
 */
export function deepMerge(target, source) {
  if (!source || typeof source !== 'object') {
    return target;
  }
  
  const result = JSON.parse(JSON.stringify(target));
  
  for (const key in source) {
    if (source.hasOwnProperty(key)) {
      if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
        // 递归合并对象
        result[key] = deepMerge(result[key] || {}, source[key]);
      } else {
        // 直接覆盖基本类型和数组
        result[key] = source[key];
      }
    }
  }
  
  return result;
}
 
/**
 * 验证配置对象
 * @param {Object} config - 配置对象
 * @returns {Object} 验证结果 {isValid: boolean, errors: Array}
 */
export function validateConfig(config) {
  const errors = [];
  
  if (!config || typeof config !== 'object') {
    errors.push('配置对象不能为空且必须是对象类型');
    return { isValid: false, errors };
  }
  
  // 验证上传URL
  if (!validateUrl(config.uploadUrl)) {
    errors.push('uploadUrl 必须是有效的URL格式');
  }
  
  // 验证文件名
  if (!validateFileName(config.fileName)) {
    errors.push('fileName 必须是有效的字符串');
  }
  
  // 验证文件类型
  if (!validateFileType(config.fileType)) {
    errors.push('fileType 必须是 png、jpg 或 jpeg');
  }
  
  // 验证质量参数
  if (!validateQuality(config.quality)) {
    errors.push('quality 必须是 0-1 之间的数字');
  }
  
  // 验证超时时间
  if (!validateTimeout(config.timeout)) {
    errors.push('timeout 必须是大于0的数字');
  }
  
  // 验证headers（如果存在）
  if (config.headers && !validateHeaders(config.headers)) {
    errors.push('headers 必须是对象类型');
  }
  
  // 验证formData（如果存在）
  if (config.formData && !validateFormData(config.formData)) {
    errors.push('formData 必须是对象类型');
  }
  
  return {
    isValid: errors.length === 0,
    errors
  };
}
 
/**
 * 验证URL格式
 * @param {string} url - 待验证的URL
 * @returns {boolean} 是否为有效URL
 */
export function validateUrl(url) {
  if (!url || typeof url !== 'string') {
    return false;
  }
  
  try {
    new URL(url);
    return true;
  } catch {
    return false;
  }
}
 
/**
 * 验证文件类型
 * @param {string} fileType - 文件类型
 * @param {Array} allowedTypes - 允许的文件类型列表
 * @returns {boolean} 是否为有效文件类型
 */
export function validateFileType(fileType, allowedTypes = ['png', 'jpg', 'jpeg']) {
  if (!fileType || typeof fileType !== 'string') {
    return false;
  }
  
  return allowedTypes.includes(fileType.toLowerCase());
}
 
/**
 * 验证质量参数
 * @param {number} quality - 质量参数
 * @returns {boolean} 是否为有效质量参数
 */
export function validateQuality(quality) {
  return typeof quality === 'number' && quality >= 0 && quality <= 1;
}
 
/**
 * 验证超时时间
 * @param {number} timeout - 超时时间(毫秒)
 * @returns {boolean} 是否为有效超时时间
 */
export function validateTimeout(timeout) {
  return typeof timeout === 'number' && timeout > 0;
}
 
/**
 * 验证文件名
 * @param {string} fileName - 文件名
 * @returns {boolean} 是否为有效文件名
 */
export function validateFileName(fileName) {
  if (!fileName || typeof fileName !== 'string') {
    return false;
  }
  
  // 检查文件名是否包含非法字符
  const invalidChars = /[<>:"/\\|?*]/;
  return !invalidChars.test(fileName) && fileName.trim().length > 0;
}
 
/**
 * 验证请求头对象
 * @param {Object} headers - 请求头对象
 * @returns {boolean} 是否为有效请求头
 */
export function validateHeaders(headers) {
  return headers && typeof headers === 'object' && !Array.isArray(headers);
}
 
/**
 * 验证表单数据对象
 * @param {Object} formData - 表单数据对象
 * @returns {boolean} 是否为有效表单数据
 */
export function validateFormData(formData) {
  return formData && typeof formData === 'object' && !Array.isArray(formData);
}
 
/**
 * 默认导出所有验证工具函数
 */
export default {
  deepMerge,
  validateConfig,
  validateUrl,
  validateFileType,
  validateQuality,
  validateTimeout,
  validateFileName,
  validateHeaders,
  validateFormData
};